package com.kevinkk.hashmap;

import java.util.*;

/**
 * 给定两个数组 nums1 和 nums2 ，返回 它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序
 *
 * 求 交集 是典型的 Hashset 的应用
 */

/**
 * Hashset 的常用方法
 *  boolean add(E e) ：向集合中添加指定的元素。如果元素已存在，则返回 false；否则返回 true。
 *  boolean remove(E e)：从集合中删除指定元素
 *  void clear()：清空集合中的元素
 *  boolean contains(E e)：查询集合中是否包含指定元素
 *  boolean isEmpty()：判断集合是否为空
 *  int size()：返回集合中元素的个数
 *  <T> T[] toArray(T[] a)：将集合中的元素存储到指定类型的数组中
 *  boolean retainAll(Collection<?>) c：仅保留集合中那些也存在于指定集合中的元素
 *  boolean removeAll(Collection<?> c)：删除集合中所有与指定集合相同的元素
 *  boolean containsAll(Collection<?> c)：检查集合是否包含指定集合中的所有元素
 */

public class IntersectionOfTwoArrays {
    class Solution {
        public int[] intersection(int[] nums1, int[] nums2) {
            HashSet<Integer> set1 = new HashSet<>(), set2 = new HashSet<>();
            for (int n : nums1)
                set1.add(n);
            for (int n : nums2)
                set2.add(n);

            return getIntersaection(set1, set2);
        }

        private int[] getIntersaection(HashSet<Integer> set1, HashSet<Integer> set2) {
            // 确保 set1 更小
            if (set1.size() > set2.size())
                return getIntersaection(set2, set1);
            List<Integer> res = new ArrayList<>();
            for (Integer i : set1) {
                if (set2.contains(i))
                    res.add(i);
            }
            int[] arr = new int[res.size()];
            int index = 0;
            for (int i : res)
                arr[index++] = i;
            return arr;
        }
    }
}
